#!/usr/bin/env bash

# This script is to package the Cura package for Windows/Linux and Mac OS X
# This script should run under Linux and Mac OS X, as well as Windows with Cygwin.

#############################
# CONFIGURATION
#############################

##Select the build target
BUILD_TARGET=win32

##Do we need to create the final archive
ARCHIVE_FOR_DISTRIBUTION=1
##Which version name are we appending to the final archive
export BUILD_NAME=14.07
TARGET_DIR=Cura-${BUILD_NAME}-${BUILD_TARGET}
TEMP_DIR=Temp
DOWNLOAD_DIR=Download

##Which versions of external programs to use
WIN_PORTABLE_PY_VERSION=2.7.2.1

##Which CuraEngine to use
if [ -z ${CURA_ENGINE_REPO} ] ; then
	CURA_ENGINE_REPO="https://github.com/Ultimaker/CuraEngine"
fi

#############################
# Support functions
#############################
function checkTool
{
	if [ -z "`which $1`" ]; then
		echo "The $1 command must be somewhere in your \$PATH."
		echo "Fix your \$PATH or install $2"
		exit 1
	fi
}

function downloadURL
{
	filename=`basename "$1"`
	foldName=$DOWNLOAD_DIR/$filename
	echo "Checking for $foldName to downlaod"
	if [ ! -f "$foldName" ]; then
		echo "Downloading $filename and save at $DOWNLOAD_DIR"
		curl -L -O "$1"
		mv $filename $DOWNLOAD_DIR
		if [ $? != 0 ]; then
			echo "Failed to download $1"
			exit 1
		fi
	fi
}

function checkAndClone
{
    repName=`basename "$1"`
    foldName=$DOWNLOAD_DIR/$repName
    echo "Checking for $repName to git clone"
    if [ ! -d $foldName ]; then
        echo "Git clone $1" and save at $foldName
        git clone "$1" $foldName
        if [ $? != 0 ]; then
            echo "Failed to clone $repName";
            exit 1;
        fi
    fi
}

function extract
{
	echo "Extracting $*"
	echo "7z x -y $* -o$TEMP_DIR" >> log.txt
	7z x -y $* -o$TEMP_DIR >> log.txt
	if [ $? != 0 ]; then
        echo "Failed to extract $*"
        exit 1
	fi
}

# Change working directory to the directory the script is in
# http://stackoverflow.com/a/246128
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd $SCRIPT_DIR

checkTool git "git: http://git-scm.com/"
checkTool curl "curl: http://curl.haxx.se/"

#Check if we have 7zip, needed to extract and packup a bunch of packages for windows.
checkTool 7z "7zip: http://www.7-zip.org/"
checkTool mingw32-make "mingw: http://www.mingw.org/"

#############################
# Download all needed files.
#############################
#Get portable python for windows and extract it. (Linux and Mac need to install python themselfs)
downloadURL http://ftp.nluug.nl/languages/python/portablepython/v2.7/PortablePython_${WIN_PORTABLE_PY_VERSION}.exe
downloadURL http://sourceforge.net/projects/pyserial/files/pyserial/2.5/pyserial-2.5.win32.exe
downloadURL http://sourceforge.net/projects/pyopengl/files/PyOpenGL/3.0.1/PyOpenGL-3.0.1.win32.exe
downloadURL http://sourceforge.net/projects/numpy/files/NumPy/1.6.2/numpy-1.6.2-win32-superpack-python2.7.exe
downloadURL http://videocapture.sourceforge.net/VideoCapture-0.9-5.zip
#downloadURL http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20120927-git-13f0cd6-win32-static.7z
downloadURL http://sourceforge.net/projects/comtypes/files/comtypes/0.6.2/comtypes-0.6.2.win32.exe
downloadURL http://www.uwe-sieber.de/files/ejectmedia.zip
#Get the power module for python
checkAndClone https://github.com/GreatFruitOmsk/Power
####checkAndClone ${CURA_ENGINE_REPO}

#############################
# Build the packages
#############################
rm -rf ${TARGET_DIR}
mkdir -p ${TARGET_DIR}
rm -f log.txt

#For windows extract portable python to include it.
extract $DOWNLOAD_DIR/PortablePython_${WIN_PORTABLE_PY_VERSION}.exe App
extract $DOWNLOAD_DIR/PortablePython_${WIN_PORTABLE_PY_VERSION}.exe App/Lib/site-packages
extract $DOWNLOAD_DIR/pyserial-2.5.win32.exe PURELIB
extract $DOWNLOAD_DIR/PyOpenGL-3.0.1.win32.exe PURELIB
extract $DOWNLOAD_DIR/numpy-1.6.2-win32-superpack-python2.7.exe numpy-1.6.2-sse2.exe
extract $TEMP_DIR/numpy-1.6.2-sse2.exe PLATLIB
extract $DOWNLOAD_DIR/VideoCapture-0.9-5.zip VideoCapture-0.9-5/Python27/DLLs/vidcap.pyd
#extract ffmpeg-20120927-git-13f0cd6-win32-static.7z ffmpeg-20120927-git-13f0cd6-win32-static/bin/ffmpeg.exe
#extract ffmpeg-20120927-git-13f0cd6-win32-static.7z ffmpeg-20120927-git-13f0cd6-win32-static/licenses
extract $DOWNLOAD_DIR/comtypes-0.6.2.win32.exe
extract $DOWNLOAD_DIR/ejectmedia.zip Win32

mkdir -p ${TARGET_DIR}/python
mkdir -p ${TARGET_DIR}/Cura/
mv $TEMP_DIR/App/* ${TARGET_DIR}/python
mv $TEMP_DIR/Lib/site-packages/wx* ${TARGET_DIR}/python/Lib/site-packages/
mv $TEMP_DIR/PURELIB/serial ${TARGET_DIR}/python/Lib
mv $TEMP_DIR/PURELIB/OpenGL ${TARGET_DIR}/python/Lib
mv $TEMP_DIR/PURELIB/comtypes ${TARGET_DIR}/python/Lib
mv $TEMP_DIR/PLATLIB/numpy ${TARGET_DIR}/python/Lib
mv $DOWN_DIR/Power/power ${TARGET_DIR}/python/Lib
mv $TEMP_DIR/VideoCapture-0.9-5/Python27/DLLs/vidcap.pyd ${TARGET_DIR}/python/DLLs
#mv ffmpeg-20120927-git-13f0cd6-win32-static/bin/ffmpeg.exe ${TARGET_DIR}/Cura/
#mv ffmpeg-20120927-git-13f0cd6-win32-static/licenses ${TARGET_DIR}/Cura/ffmpeg-licenses/
mv $TEMP_DIR/Win32/EjectMedia.exe ${TARGET_DIR}/Cura/

#Clean up portable python a bit, to keep the package size down.
rm -rf ${TARGET_DIR}/python/PyScripter.*
rm -rf ${TARGET_DIR}/python/Doc
rm -rf ${TARGET_DIR}/python/locale
rm -rf ${TARGET_DIR}/python/tcl
rm -rf ${TARGET_DIR}/python/Lib/test
rm -rf ${TARGET_DIR}/python/Lib/distutils
rm -rf ${TARGET_DIR}/python/Lib/site-packages/wx-2.8-msw-unicode/wx/tools
rm -rf ${TARGET_DIR}/python/Lib/site-packages/wx-2.8-msw-unicode/wx/locale
#Remove the gle files because they require MSVCR71.dll, which is not included. We also don't need gle, so it's safe to remove it.
rm -rf ${TARGET_DIR}/python/Lib/OpenGL/DLLS/gle*

#Build the C++ engine
#echo "make CuraEngine"
#cp -r $DOWNLOAD_DIR"\\CuraEngine" $TEMP_DIR"\\CuraEngine"
#mingw32-make -C $TEMP_DIR/CuraEngine VERSION=${BUILD_NAME}
#if [ $? != 0 ]; then
#    echo "Failed to build CuraEngine";
#    exit 1;
#fi

#add Cura
mkdir -p ${TARGET_DIR}/Cura ${TARGET_DIR}/resources ${TARGET_DIR}/plugins
cp -a Cura/* ${TARGET_DIR}/Cura
cp -a resources/* ${TARGET_DIR}/resources
cp -a plugins/* ${TARGET_DIR}/plugins
#Add cura version file
echo $BUILD_NAME > ${TARGET_DIR}/Cura/version

#add script files
cp -a scripts/${BUILD_TARGET}/*.bat $TARGET_DIR/
#cp $TEMP_DIR/CuraEngine/build/CuraEngine.exe $TARGET_DIR
cp $DOWNLOAD_DIR/CuraENgine.exe $TARGET_DIR

#package the result
if (( ${ARCHIVE_FOR_DISTRIBUTION} )); then
    #rm ${TARGET_DIR}.zip
    #cd ${TARGET_DIR}
    #7z a ../${TARGET_DIR}.zip *
    #cd ..

    if [ ! -z `which wine` ]; then
        #if we have wine, try to run our nsis script.
        rm -rf scripts/win32/dist
        ln -sf `pwd`/${TARGET_DIR} scripts/win32/dist
        wine ~/.wine/drive_c/Program\ Files/NSIS/makensis.exe /DVERSION=${BUILD_NAME} scripts/win32/installer.nsi
        if [ $? != 0 ]; then echo "Failed to package NSIS installer"; exit 1; fi
        mv scripts/win32/Cura_${BUILD_NAME}.exe ./
    fi
    if [ -f '/c/Program Files (x86)/NSIS/makensis.exe' ]; then
        rm -rf scripts/win32/dist
        mv `pwd`/${TARGET_DIR} scripts/win32/dist
        '/c/Program Files (x86)/NSIS/makensis.exe' -DVERSION=${BUILD_NAME} 'scripts/win32/installer.nsi' >> log.txt
        if [ $? != 0 ]; then echo "Failed to package NSIS installer"; exit 1; fi
        mv scripts/win32/Cura_${BUILD_NAME}.exe ./
    fi
fi
